// 获取数组原来的方法，重写其中方法即可
let oldArrayProtoMethods = Array.prototype

// 重写数组的方法思路：继承的方式，覆盖也可以，但是不建议：覆盖会导致数组本身的特性发生改变
export let ArrayMethods = Object.create(oldArrayProtoMethods)

// 劫持
let methods = [
    "push",
    "pop",
    "unshift",
    "shift",
    "splice"
]

// 增强数组的方法
methods.forEach(item => {
    ArrayMethods[item] = function (...args) {

        // 自己增强的部分
        // console.log("增强数组...");

        // 增强数组原来的方法
        let result = oldArrayProtoMethods[item].apply(this, args)
        // 添加的对象没有劫持功能，需要给所有的添加操作加上劫持操作
        // 记录新增的数据，一会需要添加劫持
        let inserted;
        switch (item) {
            case "push":
            case "unshift":
                inserted = args
                break;
            case "splice":
                // 删除操作也能实现追加功能
                // 用户调用arr.splice(0,0,{name:sa},{name:admin})    这时候args=[0,0,{name:se},{name:admin}]
                // 用户调用arr.splice({name:sa},{name:admin})    这时候args=[0,0,{name:se},{name:admin}]
                console.log("原始数据", args);
                // 直接取出第二个开始的其他参数
                inserted = args.splice(2)
        }
        // 需要给它 添加劫持功能，但是劫持的方法在/src/observe/index.js中定义的
        console.log("追加的内容", inserted);

        // 使用上一步原型上挂载的__ob__属性，得到对象上的方法，跨模块通信思路
        let ob = this.__ob__
        if (inserted) {
            ob.observeArray(inserted)
        }
        return result
    }
})